# 维吉尼亚密码(Vigenère cipher)是使用一系列凯撒密码组成的替换密码，属于多表密码的一种
# 加密原理：将明文中的每个字母按照密钥对应字母的位置进行偏移，形成密文

text = 'mrttaqrhknsw ih puggrur'
custom_key = 'happycoding'

def vigenere(message, key, direction=1):
    # direction=1表示加密，direction=-1表示解密
    key_index = 0
    # 定义字母表，用于查找字母位置和偏移计算
    alphabet = 'abcdefghijklmnopqrstuvwxyz'
    final_message = ''

    for char in message.lower():
        # 如果不是字母，直接添加到结果中（保持空格、标点符号等）
        if not char.isalpha():
            final_message += char
        else:        
            # 获取当前密钥字符，使用取模运算循环使用密钥
            key_char = key[key_index % len(key)]
            key_index += 1

            # 计算偏移量和新的字母位置
            # offset: 密钥字母在字母表中的位置
            # index: 当前明文字母在字母表中的位置
            # new_index: 加密/解密后的字母在字母表中的新位置
            offset = alphabet.index(key_char)
            index = alphabet.find(char)
            new_index = (index + offset*direction) % len(alphabet)
            final_message += alphabet[new_index]
    
    return final_message

def encrypt(message, key):
    # 加密函数，使用direction=1调用vigenere函数
    return vigenere(message, key)
    
def decrypt(message, key):
    # 解密函数，使用direction=-1调用vigenere函数
    return vigenere(message, key, -1)

# 演示加密文本的解密过程
print(f'\nEncrypted text: {text}')
print(f'Key: {custom_key}')
decryption = decrypt(text, custom_key)
print(f'\nDecrypted text: {decryption}\n')